#include "recbox.h"
#include "recboxitem.h"
#include "ui_recbox.h"

RecBox::RecBox(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::RecBox)
    , row_(1)
    , col_(4)
{
    ui->setupUi(this);
}
/**
 * @brief 初始化推荐盒子UI界面
 * @param data 包含图片路径和文本信息的JSON数组
 * @param row 显示行数，1表示单行显示，2表示双行显示
 * @details 该函数用于初始化推荐盒子的界面显示，根据指定的行数设置显示模式，
 *          并根据提供的JSON数据创建推荐项。如果是双行显示模式，会隐藏下方的推荐列表。
 * @note 此函数会计算分页信息并调用createRecBoxItem()创建具体的推荐项
 */
void RecBox::initRecBoxUi(QJsonArray data, int row)
{
    // 根据行数设置显示模式
    if (row == 2)
    {
        this->row_ = row;
        col_ = 8;
    }
    else
    {
        // 单行显示时隐藏下方推荐列表
        ui->recListDown->hide();
    }
    // 保存图片数据列表
    imageList_ = data;
    // 初始化当前页索引
    currentIndex_ = 0;
    // 计算总页数
    count_ = imageList_.size() / col_;
    // 创建推荐项
    createRecBoxItem();
}
/**
 * @brief 创建推荐盒子项
 * @details 该函数负责创建并显示推荐项，执行以下操作：
 *          1. 清除现有的推荐项
 *          2. 根据当前页索引和列数计算需要显示的图片范围
 *          3. 为每个图片创建recBoxItem对象并设置图片和文本
 *          4. 根据行数将推荐项添加到对应的布局中
 * @note 此函数会在分页切换时被调用
 */
void RecBox::createRecBoxItem()
{
    // 清除上方推荐列表中的现有项
    QList<recBoxItem *> recUpList = ui->recListUp->findChildren<recBoxItem *>();
    for (const auto &e : recUpList)
    {
        ui->recListUpHLayout->removeWidget(e);
        delete e;
    }

    // 清除下方推荐列表中的现有项
    QList<recBoxItem *> recDownList = ui->recListDown->findChildren<recBoxItem *>();
    for (const auto &e : recDownList)
    {
        ui->recListDownHLayout->removeWidget(e);
        delete e;
    }

    // 创建新地推荐项
    int index = 0;
    for (int i = currentIndex_ * col_; i < col_ + col_ * currentIndex_; i++)
    {
        // 创建推荐项对象
        recBoxItem *item = new recBoxItem();
        // 获取图片数据
        QJsonObject obj = imageList_[i].toObject();
        // 设置推荐项文本
        item->setRecText(obj.value("text").toString());
        // 设置推荐项图片
        item->setRecImage(obj.value("path").toString());
        // 根据索引和行数将推荐项添加到对应布局
        if (index >= col_ / 2 && row_ == 2)
        {
            ui->recListDownHLayout->addWidget(item);
        }
        else
        {
            ui->recListUpHLayout->addWidget(item);
        }
        index++;
    }
}
RecBox::~RecBox()
{
    delete ui;
}


/**
 * @brief 下一页按钮点击事件处理函数
 * @details 该函数在用户点击下一页按钮时被调用，
 *          将当前页索引加1，如果已经是最后一页则回到第一页，
 *          然后重新创建推荐项以显示新的页面内容。
 * @note 此函数通过循环方式实现页面切换
 */
void RecBox::on_btDown_clicked()
{
    // 点击之后，需要显示一组图片，如果已经是最后一组图片，显示第0组
    currentIndex_++;
    if (currentIndex_ >= count_)
        currentIndex_ = 0;
    createRecBoxItem();
}
/**
 * @brief 上一页按钮点击事件处理函数
 * @details 该函数在用户点击上一页按钮时被调用，
 *          将当前页索引减1，如果已经是第一页则跳到最后一页，
 *          然后重新创建推荐项以显示新的页面内容。
 * @note 此函数通过循环方式实现页面切换
 */
void RecBox::on_btUp_clicked()
{
    // 点击之后，需要显示前一组图片，如果是第0组图片，让其显示最后一组
    currentIndex_--;
    if (currentIndex_ < 0)
        currentIndex_ = count_ - 1;
    createRecBoxItem();
}